package aerolinea;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;

import ubicacionEnAvion.Centro;
import ubicacionEnAvion.Pasillo;
import ubicacionEnAvion.UbicacionEnAvion;
import ubicacionEnAvion.Ventana;
import usuario.Usuario;
import asiento.Asiento;
import busqueda.Busqueda;
import claseAsiento.ClaseAsiento;
import claseAsiento.Ejecutiva;
import claseAsiento.PrimeraClase;
import claseAsiento.Turista;

import com.lanchita.AerolineaLanchita;

import formatos.LanchitaFormater;

public class LanchitaAdapter extends Aerolinea {

	private AerolineaLanchita instance;
	
	public LanchitaAdapter(){
		this.setFormateador(new LanchitaFormater());
		this.setPorcentajeImpuesto(new BigDecimal ("0.15"));
	}

	//realiza la conversion de los asientos lanchita a asientos aterrizar a bajo nivel	
	public Collection<Asiento> getAsientosDisponibles(Busqueda busqueda) {
		
		String[][] vuelosDisponibles = this.getInstance().asientosDisponibles(busqueda.getOrigen(), busqueda.getDestino(), busqueda.getFechaSalida(), null,busqueda.getHoraSalida(),busqueda.getHoraLlegada());
		Collection<Asiento> asientos = new ArrayList<Asiento>();
		for ( int i = 0; i < vuelosDisponibles.length  ; i++ ){
		
			Asiento asiento = new Asiento();
			asiento.setCodigoAsiento(vuelosDisponibles[i][0]);	
			asiento.setNumeroAsiento(vuelosDisponibles[i][0].split("-")[1]);
			//Conversion loca para pasar de string a bigDecimal
			BigDecimal precio = (new BigDecimal((vuelosDisponibles[i][1]).replaceAll(",", "")));
			asiento.setPrecio(precio.add(precio.multiply(getPorcentajeImpuesto())).add(busqueda.getRecargoPorTipoUsuario())); 
			asiento.setClaseAsiento(this.parsearClaseAsiento(vuelosDisponibles[i][2]));
			asiento.setUbicacionEnAvion(this.parsearUbicacionAsiento(vuelosDisponibles[i][3]));
			asiento.setearEstadoADisponible();
			try{
			asiento.setFechaSalida(this.getFormateador().convertir(vuelosDisponibles[i][10] + "-" + vuelosDisponibles[i][6]));
			asiento.setFechaLlegada(this.getFormateador().convertir(vuelosDisponibles[i][11] + "-" + vuelosDisponibles[i][7]));
			}catch (ParseException pe){
				System.out.println("error al parsear una fecha del asiento");
			}
			asiento.setOrigen(vuelosDisponibles[i][8]);
			asiento.setDestino(vuelosDisponibles[i][9]);
			asientos.add(asiento);
		//TODO no se calcula el tiempo de vuelo...	
		
		}
		return  asientos;
	}

	private UbicacionEnAvion parsearUbicacionAsiento(String string) {
		if (string.equals("P")){
			return new Pasillo();
		}
		else {
			if (string.equals("V")) return new Ventana();
			return new Centro();
		}
		
	}

	private ClaseAsiento parsearClaseAsiento(String string) {
		if (string.equals("P")){
			return new PrimeraClase();
		}
		else {
			if (string.equals("T")) return new Turista();
			return new Ejecutiva();
		}
	}

	public String extraerCodigoVuelo(String codigoAsiento) {
		String codigoVuelo;
		String delims = "[-]+";
		String[] tokens = codigoAsiento.split(delims);
		codigoVuelo = tokens[0];
		return codigoVuelo;
	}


	@Override
	public void comprarAsiento(Asiento asiento, Usuario usuario) {
		AerolineaLanchita.getInstance().comprar(asiento.getCodigoAsiento());
	}

	public void setInstance(AerolineaLanchita instance) {
		this.instance = instance;
	}

	public AerolineaLanchita getInstance() {
		if(instance == null){
			instance = AerolineaLanchita.getInstance();
		}
		return instance;
	}

	@Override
	public void reservarAsiento(Asiento asiento, Usuario usuario) {
		instance.reservar(asiento.getCodigoAsiento(), usuario.getDni());		
	}

}
